/**
 * 
 */

package com.gustozzi.distribucion.action;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.gustozzi.distribucion.action.util.Constantes;
import com.gustozzi.distribucion.negocio.GeneralBO;
import com.gustozzi.distribucion.negocio.impl.GeneralBOImpl;
import com.gustozzi.domain.DocumentoTributario;
import com.opensymphony.xwork2.ActionSupport;

/**
 * @author FABRIZIO
 * 
 */
public class DocumentoAction extends ActionSupport implements ServletRequestAware
{

    private static final long serialVersionUID = 1L;
    GeneralBO generalBO = new GeneralBOImpl();
    private String botonSeleccionado;
    private DocumentoTributario documentoTributario;
    private HttpServletRequest request;
    private List<DocumentoTributario> listaDocumentosTributarios;
    private ArrayList<String> listaSeleccionados;

    public String execute()
    {
        String destino = Constantes.CADENA_VACIA;
        try
        {
            if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_FILTRAR))
            {
                destino = obtenerListaDocumentos();
            }
            else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_ACEPTAR))
            {
                destino = asignarDocumentos();
            }
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    public String obtenerListaDocumentos()
    {
        String destino = Constantes.CADENA_VACIA;
        List<DocumentoTributario> listaDocumentos = null;
        try
        {
            String numero = documentoTributario.getNumero();
            String numeroRuc = documentoTributario.getCliente().getRuc();

            listaDocumentos = generalBO.obtenerListaDocumetos(numero, numeroRuc);
            request.getSession().setAttribute("listaDocumentosCompletaSession", listaDocumentos);
            this.setListaDocumentosTributarios(listaDocumentos);
            destino = Constantes.CONSULTARDOCUMENTO;
        }
        catch (Exception e)
        {
            destino = "ERROR";
        }
        return destino;
    }

    @SuppressWarnings("unchecked")
    public String asignarDocumentos()
    {
        String destino = "";
        List<DocumentoTributario> listaDocumentosSeleccionados = null;
        boolean indicadorCoincidencia = false;
        try
        {
            if (listaSeleccionados != null)
            {
                List<String> lista = listaSeleccionados;
                List<DocumentoTributario> listaDocumentosSession = (ArrayList<DocumentoTributario>) request
                        .getSession().getAttribute("listaDocumentosCompletaSession");
                listaDocumentosSeleccionados = new ArrayList<DocumentoTributario>();
                for (int i = 0; i < listaDocumentosSession.size(); i++)
                {
                    DocumentoTributario documento = listaDocumentosSession.get(i);
                    for (int j = 0; j < lista.size(); j++)
                    {
                        if (documento.getNumero().equalsIgnoreCase(lista.get(j)))
                        {
                            listaDocumentosSeleccionados.add(documento);
                        }
                    }
                }
                if (request.getSession().getAttribute("listaDocumentosSession") != null)
                {
                    List<DocumentoTributario> listaPrevia = (ArrayList<DocumentoTributario>) request.getSession()
                            .getAttribute("listaDocumentosSession");
                    for (int k = 0; k < listaPrevia.size(); k++)
                    {
                        DocumentoTributario documentoPrevio = listaPrevia.get(k);
                        indicadorCoincidencia = false;
                        for (int m = 0; m < listaDocumentosSeleccionados.size(); m++)
                        {
                            DocumentoTributario documentoNuevo = listaDocumentosSeleccionados.get(m);
                            if (documentoPrevio.getNumero().equalsIgnoreCase(documentoNuevo.getNumero()))
                            {
                                indicadorCoincidencia = true;
                            }
                        }
                        if (!indicadorCoincidencia)
                        {
                            listaDocumentosSeleccionados.add(listaPrevia.get(k));
                        }
                    }
                }

                setListaDocumentosTributarios(listaDocumentosSeleccionados);
                request.getSession().removeAttribute("listaDocumentosCompletaSession");
                request.getSession().setAttribute("listaDocumentosSession", listaDocumentosSeleccionados);
            }
            destino = Constantes.DOCUMENTOASIGNADO;
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    /**
     * @param botonSeleccionado
     *            the botonSeleccionado to set
     */
    public void setBotonSeleccionado(String botonSeleccionado)
    {
        this.botonSeleccionado = botonSeleccionado;
    }

    @Override
    public void setServletRequest(HttpServletRequest request)
    {
        this.request = request;
    }

    /**
     * @return the listaSeleccionados
     */
    public ArrayList<String> getListaSeleccionados()
    {
        return listaSeleccionados;
    }

    /**
     * @param listaSeleccionados
     *            the listaSeleccionados to set
     */
    public void setListaSeleccionados(ArrayList<String> listaSeleccionados)
    {
        this.listaSeleccionados = listaSeleccionados;
    }

    /**
     * @return the botonSeleccionado
     */
    public String getBotonSeleccionado()
    {
        return botonSeleccionado;
    }

    /**
     * @return the documentoTributario
     */
    public DocumentoTributario getDocumentoTributario()
    {
        return documentoTributario;
    }

    /**
     * @return the listaDocumentosTributarios
     */
    public List<DocumentoTributario> getListaDocumentosTributarios()
    {
        return listaDocumentosTributarios;
    }

    /**
     * @param documentoTributario
     *            the documentoTributario to set
     */
    public void setDocumentoTributario(DocumentoTributario documentoTributario)
    {
        this.documentoTributario = documentoTributario;
    }

    /**
     * @param listaDocumentosTributarios
     *            the listaDocumentosTributarios to set
     */
    public void setListaDocumentosTributarios(List<DocumentoTributario> listaDocumentosTributarios)
    {
        this.listaDocumentosTributarios = listaDocumentosTributarios;
    }
}